home *** CD-ROM | disk | FTP | other *** search
/ CU Amiga Super CD-ROM 23 / CU Amiga - Super CD-ROM 23 (June 1998).iso / CreatingGames / Utilities / C / Mesa / samples / logo.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-03-14  |  35.7 KB  |  1,600 lines

  1. /*
  2.  * Copyright (c) 1991, 1992, 1993 Silicon Graphics, Inc.
  3.  *
  4.  * Permission to use, copy, modify, distribute, and sell this software and
  5.  * its documentation for any purpose is hereby granted without fee, provided
  6.  * that (i) the above copyright notices and this permission notice appear in
  7.  * all copies of the software and related documentation, and (ii) the name of
  8.  * Silicon Graphics may not be used in any advertising or
  9.  * publicity relating to the software without the specific, prior written
  10.  * permission of Silicon Graphics.
  11.  *
  12.  * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF
  13.  * ANY KIND,
  14.  * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY
  15.  * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
  16.  *
  17.  * IN NO EVENT SHALL SILICON GRAPHICS BE LIABLE FOR
  18.  * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND,
  19.  * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
  20.  * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF
  21.  * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
  22.  * OF THIS SOFTWARE.
  23.  */
  24.  
  25. #include <stdio.h>
  26. #include <string.h>
  27. #include <stdlib.h>
  28. #include "gltk.h"
  29.  
  30.  
  31. #define PI 3.141592654
  32.  
  33. #define    BLACK 0
  34. #define    GRAY 128
  35. #define    WHITE 255
  36. #define BL 0x00
  37. #define WH 0xFF
  38. #define RD 0xA4,0x00,0x00,0xFF
  39. #define WT 0xFF,0xFF,0xFF,0xFF
  40.  
  41. #define    CHECKIMAGEWIDTH 8
  42. #define    CHECKIMAGEHEIGHT 8
  43. #define    BRICKIMAGEWIDTH 16
  44. #define    BRICKIMAGEHEIGHT 16
  45.  
  46.  
  47. GLenum rgb, doubleBuffer, directRender;
  48.  
  49. float black[3] = {0.0, 0.0, 0.0};
  50. float white[3] = {1.0, 1.0, 1.0};
  51. float gray[3] = {0.5, 0.5, 0.5};
  52. float blue[3] = {0.0, 0.0, 1.0};
  53. GLint colorIndexes[3] = {0, 200, 255};
  54.  
  55. GLenum polyMode;
  56. GLenum dithering;
  57. GLenum shade;
  58. GLenum doStipple;
  59. GLenum noDraw = 0;
  60.  
  61. double plane[4] = {1.0, 0.0, -1.0, 0.0};
  62. float xRotation = 30.0, yRotation = 30.0;
  63. float zTranslation = -15.0;
  64.  
  65. GLint singleCylinder;
  66. GLint doubleCylinder;
  67. GLint elbow, logo;
  68.  
  69. GLubyte checkImage[3*CHECKIMAGEWIDTH*CHECKIMAGEHEIGHT] = {
  70.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  71.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  72.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  73.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  74.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  75.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  76.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  77.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  78.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL,
  79.     BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH,
  80.     WH, WH, BL, BL, BL, WH, WH, WH, WH, WH, WH, BL, BL, BL, WH, WH,
  81.     WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, WH, WH, WH, BL, BL, BL, 
  82. };
  83. GLubyte brickImage[4*BRICKIMAGEWIDTH*BRICKIMAGEHEIGHT] = {
  84.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  85.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  86.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  87.     RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD,
  88.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  89.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  90.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  91.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  92.     RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD, RD,
  93.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  94.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  95.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  96.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  97.     RD, RD, RD, RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD,
  98.     WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT, WT,
  99.     RD, RD, RD, RD, WT, RD, RD, RD, RD, RD, RD, RD, RD, RD, WT, RD
  100. };
  101.  
  102. GLubyte *image = checkImage;
  103. GLint imageHeight = CHECKIMAGEHEIGHT;
  104. GLint imageWidth = CHECKIMAGEWIDTH;
  105.  
  106. float decal[] = {
  107.     GL_DECAL,
  108. };
  109. float modulate[] = {
  110.     GL_MODULATE,
  111. };
  112. float repeat[] = {
  113.     GL_REPEAT,
  114. };
  115. float nearest[] = {
  116.     GL_NEAREST,
  117. };
  118.  
  119. GLubyte stipple[4*32] = {
  120.     0x00, 0x00, 0x00, 0x00,
  121.     0x00, 0x00, 0x00, 0x00,
  122.     0x00, 0x00, 0x00, 0x00,
  123.     0x00, 0x00, 0x00, 0x00,
  124.     0x00, 0x00, 0x00, 0x00,
  125.     0x00, 0x00, 0x00, 0x00,
  126.     0x00, 0x00, 0x00, 0x00,
  127.     0x00, 0x00, 0x00, 0x00,
  128.  
  129.     0x00, 0x0F, 0xF0, 0x00,
  130.     0x00, 0x0F, 0xF0, 0x00,
  131.     0x00, 0x0F, 0xF0, 0x00,
  132.     0x00, 0x0F, 0xF0, 0x00,
  133.     0x00, 0x0F, 0xF0, 0x00,
  134.     0x00, 0x0F, 0xF0, 0x00,
  135.     0x00, 0x0F, 0xF0, 0x00,
  136.     0x00, 0x0F, 0xF0, 0x00,
  137.  
  138.     0x00, 0x0F, 0xF0, 0x00,
  139.     0x00, 0x0F, 0xF0, 0x00,
  140.     0x00, 0x0F, 0xF0, 0x00,
  141.     0x00, 0x0F, 0xF0, 0x00,
  142.     0x00, 0x0F, 0xF0, 0x00,
  143.     0x00, 0x0F, 0xF0, 0x00,
  144.     0x00, 0x0F, 0xF0, 0x00,
  145.     0x00, 0x0F, 0xF0, 0x00,
  146.  
  147.     0x00, 0x00, 0x00, 0x00,
  148.     0x00, 0x00, 0x00, 0x00,
  149.     0x00, 0x00, 0x00, 0x00,
  150.     0x00, 0x00, 0x00, 0x00,
  151.     0x00, 0x00, 0x00, 0x00,
  152.     0x00, 0x00, 0x00, 0x00,
  153.     0x00, 0x00, 0x00, 0x00,
  154.     0x00, 0x00, 0x00, 0x00,
  155. };
  156.  
  157. float tscp[18][2] = {
  158.     {
  159.     0.0, 0.0
  160.     },
  161.     {
  162.     1.0, 0.0
  163.     },
  164.     {
  165.     0.0, 0.125
  166.     },
  167.     {
  168.     1.0, 0.125
  169.     },
  170.     {
  171.     0.0, 0.250
  172.     },
  173.     {
  174.     1.0, 0.25
  175.     },
  176.     {
  177.     0.0, 0.375
  178.     },
  179.     {
  180.     1.0, 0.375
  181.     },
  182.     {
  183.     0.0, 0.50
  184.     },
  185.     {
  186.     1.0, 0.50
  187.     },
  188.     {
  189.     0.0, 0.625
  190.     },
  191.     {
  192.     1.0, 0.625
  193.     },
  194.     {
  195.     0.0, 0.75
  196.     },
  197.     {
  198.     1.0, 0.75
  199.     },
  200.     {
  201.     0.0, 0.875
  202.     },
  203.     {
  204.     1.0, 0.875
  205.     },
  206.     {
  207.     0.0, 1.0
  208.     },
  209.     {
  210.     1.0, 1.0
  211.     }
  212. };
  213. float scp[18][3] = {
  214.     {
  215.     1.000000, 0.000000, 0.000000
  216.     },
  217.     {
  218.     1.000000, 0.000000, 5.000000
  219.     },
  220.     {
  221.     0.707107, 0.707107, 0.000000
  222.     },
  223.     {
  224.     0.707107, 0.707107, 5.000000
  225.     },
  226.     {
  227.     0.000000, 1.000000, 0.000000
  228.     },
  229.     {
  230.     0.000000, 1.000000, 5.000000
  231.     },
  232.     {
  233.     -0.707107, 0.707107, 0.000000
  234.     },
  235.     {
  236.     -0.707107, 0.707107, 5.000000
  237.     },
  238.     {
  239.     -1.000000, 0.000000, 0.000000
  240.     },
  241.     {
  242.     -1.000000, 0.000000, 5.000000
  243.     },
  244.     {
  245.     -0.707107, -0.707107, 0.000000
  246.     },
  247.     {
  248.     -0.707107, -0.707107, 5.000000
  249.     },
  250.     {
  251.     0.000000, -1.000000, 0.000000
  252.     },
  253.     {
  254.     0.000000, -1.000000, 5.000000
  255.     },
  256.     {
  257.     0.707107, -0.707107, 0.000000
  258.     },
  259.     {
  260.     0.707107, -0.707107, 5.000000
  261.     },
  262.     {
  263.     1.000000, 0.000000, 0.000000
  264.     },
  265.     {
  266.     1.000000, 0.000000, 5.000000
  267.     }
  268. };
  269. float dcp[18][3] = {
  270.     {
  271.     1.000000, 0.000000, 0.000000
  272.     },
  273.     {
  274.     1.000000, 0.000000, 7.000000
  275.     },
  276.     {
  277.     0.707107, 0.707107, 0.000000
  278.     },
  279.     {
  280.     0.707107, 0.707107, 7.000000
  281.     },
  282.     {
  283.     0.000000, 1.000000, 0.000000
  284.     },
  285.     {
  286.     0.000000, 1.000000, 7.000000
  287.     },
  288.     {
  289.     -0.707107, 0.707107, 0.000000
  290.     },
  291.     {
  292.     -0.707107, 0.707107, 7.000000
  293.     },
  294.     {
  295.     -1.000000, 0.000000, 0.000000
  296.     },
  297.     {
  298.     -1.000000, 0.000000, 7.000000
  299.     },
  300.     {
  301.     -0.707107, -0.707107, 0.000000
  302.     },
  303.     {
  304.     -0.707107, -0.707107, 7.000000
  305.     },
  306.     {
  307.     0.000000, -1.000000, 0.000000
  308.     },
  309.     {
  310.     0.000000, -1.000000, 7.000000
  311.     },
  312.     {
  313.     0.707107, -0.707107, 0.000000
  314.     },
  315.     {
  316.     0.707107, -0.707107, 7.000000
  317.     },
  318.     {
  319.     1.000000, 0.000000, 0.000000
  320.     },
  321.     {
  322.     1.000000, 0.000000, 7.000000
  323.     }
  324. };
  325. float ep[7][9][3] = {
  326.     {
  327.     {
  328.         1.000000, 0.000000, 0.000000
  329.     },
  330.     {
  331.         0.707107, 0.707107, 0.000000
  332.     },
  333.     {
  334.         0.000000, 1.000000, 0.000000
  335.     },
  336.     {
  337.         -0.707107, 0.707107, 0.000000
  338.     },
  339.     {
  340.         -1.000000, 0.000000, 0.000000
  341.     },
  342.     {
  343.         -0.707107, -0.707107, 0.000000
  344.     },
  345.     {
  346.         0.000000, -1.000000, 0.000000
  347.     },
  348.     {
  349.         0.707107, -0.707107, 0.000000
  350.     },
  351.     {
  352.         1.000000, 0.000000, 0.000000
  353.     }
  354.     },
  355.     {
  356.     {
  357.         1.000000, 0.034074, 0.258819
  358.     },
  359.     {
  360.         0.707107, 0.717087, 0.075806
  361.     },
  362.     {
  363.         0.000000, 1.000000, 0.000000
  364.     },
  365.     {
  366.         -0.707107, 0.717087, 0.075806
  367.     },
  368.     {
  369.         -1.000000, 0.034074, 0.258819
  370.     },
  371.     {
  372.         -0.707107, -0.648939, 0.441832
  373.     },
  374.     {
  375.         0.000000, -0.931852, 0.517638
  376.     },
  377.     {
  378.         0.707107, -0.648939, 0.441832
  379.     },
  380.     {
  381.         1.000000, 0.034074, 0.258819
  382.     }
  383.     },
  384.     {
  385.     {
  386.         1.000000, 0.133975, 0.500000
  387.     },
  388.     {
  389.         0.707107, 0.746347, 0.146447
  390.     },
  391.     {
  392.         0.000000, 1.000000, 0.000000
  393.     },
  394.     {
  395.         -0.707107, 0.746347, 0.146447
  396.     },
  397.     {
  398.         -1.000000, 0.133975, 0.500000
  399.     },
  400.     {
  401.         -0.707107, -0.478398, 0.853553
  402.     },
  403.     {
  404.         0.000000, -0.732051, 1.000000
  405.     },
  406.     {
  407.         0.707107, -0.478398, 0.853553
  408.     },
  409.     {
  410.         1.000000, 0.133975, 0.500000
  411.     }
  412.     },
  413.     {
  414.     {
  415.         1.000000, 0.292893, 0.707107
  416.     },
  417.     {
  418.         0.707107, 0.792893, 0.207107
  419.     },
  420.     {
  421.         0.000000, 1.000000, 0.000000
  422.     },
  423.     {
  424.         -0.707107, 0.792893, 0.207107
  425.     },
  426.     {
  427.         -1.000000, 0.292893, 0.707107
  428.     },
  429.     {
  430.         -0.707107, -0.207107, 1.207107
  431.     },
  432.     {
  433.         0.000000, -0.414214, 1.414214
  434.     },
  435.     {
  436.         0.707107, -0.207107, 1.207107
  437.     },
  438.     {
  439.         1.000000, 0.292893, 0.707107
  440.     }
  441.     },
  442.     {
  443.     {
  444.         1.000000, 0.500000, 0.866025
  445.     },
  446.     {
  447.         0.707107, 0.853553, 0.253653
  448.     },
  449.     {
  450.         0.000000, 1.000000, 0.000000
  451.     },
  452.     {
  453.         -0.707107, 0.853553, 0.253653
  454.     },
  455.     {
  456.         -1.000000, 0.500000, 0.866025
  457.     },
  458.     {
  459.         -0.707107, 0.146447, 1.478398
  460.     },
  461.     {
  462.         0.000000, 0.000000, 1.732051
  463.     },
  464.     {
  465.         0.707107, 0.146447, 1.478398
  466.     },
  467.     {
  468.         1.000000, 0.500000, 0.866025
  469.     }
  470.     },
  471.     {
  472.     {
  473.         1.000000, 0.741181, 0.965926
  474.     },
  475.     {
  476.         0.707107, 0.924194, 0.282913
  477.     },
  478.     {
  479.         0.000000, 1.000000, 0.000000
  480.     },
  481.     {
  482.         -0.707107, 0.924194, 0.282913
  483.     },
  484.     {
  485.         -1.000000, 0.741181, 0.965926
  486.     },
  487.     {
  488.         -0.707107, 0.558168, 1.648939
  489.     },
  490.     {
  491.         0.000000, 0.482362, 1.931852
  492.     },
  493.     {
  494.         0.707107, 0.558168, 1.648939
  495.     },
  496.     {
  497.         1.000000, 0.741181, 0.965926
  498.     }
  499.     },
  500.     {
  501.     {
  502.         1.000000, 1.000000, 1.000000
  503.     },
  504.     {
  505.         0.707107, 1.000000, 0.292893
  506.     },
  507.     {
  508.         0.000000, 1.000000, 0.000000
  509.     },
  510.     {
  511.         -0.707107, 1.000000, 0.292893
  512.     },
  513.     {
  514.         -1.000000, 1.000000, 1.000000
  515.     },
  516.     {
  517.         -0.707107, 1.000000, 1.707107
  518.     },
  519.     {
  520.         0.000000, 1.000000, 2.000000
  521.     },
  522.     {
  523.         0.707107, 1.000000, 1.707107
  524.     },
  525.     {
  526.         1.000000, 1.000000, 1.000000
  527.     }
  528.     }
  529. };
  530. float en[7][9][3] = {
  531.     {
  532.     {
  533.         1.000000, 0.000000, 0.000000
  534.     },
  535.     {
  536.         0.707107, 0.707107, 0.000000
  537.     },
  538.     {
  539.         0.000000, 1.000000, 0.000000
  540.     },
  541.     {
  542.         -0.707107, 0.707107, 0.000000
  543.     },
  544.     {
  545.         -1.000000, 0.000000, 0.000000
  546.     },
  547.     {
  548.         -0.707107, -0.707107, 0.000000
  549.     },
  550.     {
  551.         0.000000, -1.000000, 0.000000
  552.     },
  553.     {
  554.         0.707107, -0.707107, 0.000000
  555.     },
  556.     {
  557.         1.000000, 0.000000, 0.000000
  558.     }
  559.     },
  560.     {
  561.     {
  562.         1.000000, 0.000000, 0.000000
  563.     },
  564.     {
  565.         0.707107, 0.683013, -0.183013
  566.     },
  567.     {
  568.         0.000000, 0.965926, -0.258819
  569.     },
  570.     {
  571.         -0.707107, 0.683013, -0.183013
  572.     },
  573.     {
  574.         -1.000000, 0.000000, 0.000000
  575.     },
  576.     {
  577.         -0.707107, -0.683013, 0.183013
  578.     },
  579.     {
  580.         0.000000, -0.965926, 0.258819
  581.     },
  582.     {
  583.         0.707107, -0.683013, 0.183013
  584.     },
  585.     {
  586.         1.000000, 0.000000, 0.000000
  587.     }
  588.     },
  589.     {
  590.     {
  591.         1.000000, 0.000000, 0.000000
  592.     },
  593.     {
  594.         0.707107, 0.612372, -0.353553
  595.     },
  596.     {
  597.         0.000000, 0.866025, -0.500000
  598.     },
  599.     {
  600.         -0.707107, 0.612372, -0.353553
  601.     },
  602.     {
  603.         -1.000000, 0.000000, 0.000000
  604.     },
  605.     {
  606.         -0.707107, -0.612372, 0.353553
  607.     },
  608.     {
  609.         0.000000, -0.866025, 0.500000
  610.     },
  611.     {
  612.         0.707107, -0.612372, 0.353553
  613.     },
  614.     {
  615.         1.000000, 0.000000, 0.000000
  616.     }
  617.     },
  618.     {
  619.     {
  620.         1.000000, 0.000000, 0.000000
  621.     },
  622.     {
  623.        /* These 3 lines added by BEP */
  624.         0.707107, 0.500000, -0.500000
  625.     },
  626.     {
  627.         0.000000, 0.707107, -0.707107
  628.     },
  629.     {
  630.         -0.707107, 0.500000, -0.500000
  631.     },
  632.     {
  633.         -1.000000, 0.000000, 0.000000
  634.     },
  635.     {
  636.         -0.707107, -0.500000, 0.500000
  637.     },
  638.     {
  639.         0.000000, -0.707107, 0.707107
  640.     },
  641.     {
  642.         0.707107, -0.500000, 0.500000
  643.     },
  644.     {
  645.         1.000000, 0.000000, 0.000000
  646.     }
  647.     },
  648.     {
  649.     {
  650.         1.000000, 0.000000, 0.000000
  651.     },
  652.     {
  653.         0.707107, 0.353553, -0.612372
  654.     },
  655.     {
  656.         0.000000, 0.500000, -0.866025
  657.     },
  658.     {
  659.         -0.707107, 0.353553, -0.612372
  660.     },
  661.     {
  662.         -1.000000, 0.000000, 0.000000
  663.     },
  664.     {
  665.         -0.707107, -0.353553, 0.612372
  666.     },
  667.     {
  668.         0.000000, -0.500000, 0.866025
  669.     },
  670.     {
  671.         0.707107, -0.353553, 0.612372
  672.     },
  673.     {
  674.         1.000000, 0.000000, 0.000000
  675.     }
  676.     },
  677.     {
  678.     {
  679.         1.000000, 0.000000, 0.000000
  680.     },
  681.     {
  682.         0.707107, 0.183013, -0.683013
  683.     },
  684.     {
  685.         0.000000, 0.258819, -0.965926
  686.     },
  687.     {
  688.         -0.707107, 0.183013, -0.683013
  689.     },
  690.     {
  691.         -1.000000, 0.000000, 0.000000
  692.     },
  693.     {
  694.         -0.707107, -0.183013, 0.683013
  695.     },
  696.     {
  697.         0.000000, -0.258819, 0.965926
  698.     },
  699.     {
  700.         0.707107, -0.183013, 0.683013
  701.     },
  702.     {
  703.         1.000000, 0.000000, 0.000000
  704.     }
  705.     },
  706.     {
  707.     {
  708.         1.000000, 0.000000, 0.000000
  709.     },
  710.     {
  711.         0.707107, 0.000000, -0.707107
  712.     },
  713.     {
  714.         0.000000, 0.000000, -1.000000
  715.     },
  716.     {
  717.         -0.707107, 0.000000, -0.707107
  718.     },
  719.     {
  720.         -1.000000, 0.000000, 0.000000
  721.     },
  722.     {
  723.         -0.707107, 0.000000, 0.707107
  724.     },
  725.     {
  726.         0.000000, 0.000000, 1.000000
  727.     },
  728.     {
  729.         0.707107, 0.000000, 0.707107
  730.     },
  731.     {
  732.         1.000000, 0.000000, 0.000000
  733.     }
  734.     }
  735. };
  736. float tep[7][9][2] = {
  737.     {
  738.     {
  739.         0,     0.0
  740.     },
  741.     {
  742.         0.125, 0.0
  743.     },
  744.     {
  745.         0.25,  0.0
  746.     },
  747.     {
  748.         0.375, 0.0
  749.     },
  750.     {
  751.         0.5,   0.0
  752.     },
  753.     {
  754.         0.625, 0.0
  755.     },
  756.     {
  757.         0.75,  0.0
  758.     },
  759.     {
  760.         0.875, 0.0
  761.     },
  762.     {
  763.         1.0,   0.0
  764.     }
  765.     },
  766.     {
  767.     {
  768.         0,     0.16667
  769.     },
  770.     {
  771.         0.125, 0.16667
  772.     },
  773.     {
  774.         0.25,  0.16667
  775.     },
  776.     {
  777.         0.375, 0.16667
  778.     },
  779.     {
  780.         0.5,   0.16667
  781.     },
  782.     {
  783.         0.625, 0.16667
  784.     },
  785.     {
  786.         0.75,  0.16667
  787.     },
  788.     {
  789.         0.875, 0.16667
  790.     },
  791.     {
  792.         1.0,   0.16667
  793.     }
  794.     },
  795.     {
  796.     {
  797.         0,     0.33333
  798.     },
  799.     {
  800.         0.125, 0.33333
  801.     },
  802.     {
  803.         0.25,  0.33333
  804.     },
  805.     {
  806.         0.375, 0.33333
  807.     },
  808.     {
  809.         0.5,   0.33333
  810.     },
  811.     {
  812.         0.625, 0.33333
  813.     },
  814.     {
  815.         0.75,  0.33333
  816.     },
  817.     {
  818.         0.875, 0.33333
  819.     },
  820.     {
  821.         1.0,   0.33333
  822.     }
  823.     },
  824.     {
  825.     {
  826.         0,     0.5
  827.     },
  828.     {
  829.         0.125, 0.5
  830.     },
  831.     {
  832.         0.25,  0.5
  833.     },
  834.     {
  835.         0.375, 0.5
  836.     },
  837.     {
  838.         0.5,   0.5
  839.     },
  840.     {
  841.         0.625, 0.5
  842.     },
  843.     {
  844.         0.75,  0.5
  845.     },
  846.     {
  847.         0.875, 0.5
  848.     },
  849.     {
  850.         1.0,   0.5
  851.     }
  852.     },
  853.     {
  854.     {
  855.         0,     0.6667
  856.     },
  857.     {
  858.         0.125, 0.6667
  859.     },
  860.     {
  861.         0.25,  0.6667
  862.     },
  863.     {
  864.         0.375, 0.6667
  865.     },
  866.     {
  867.         0.5,   0.6667
  868.     },
  869.     {
  870.         0.625, 0.6667
  871.     },
  872.     {
  873.         0.75,  0.6667
  874.     },
  875.     {
  876.         0.875, 0.6667
  877.     },
  878.     {
  879.         1.0,   0.6667
  880.     }
  881.     },
  882.     {
  883.     {
  884.         0,     0.83333
  885.     },
  886.     {
  887.         0.125, 0.83333
  888.     },
  889.     {
  890.         0.25,  0.83333
  891.     },
  892.     {
  893.         0.375, 0.83333
  894.     },
  895.     {
  896.         0.5,   0.83333
  897.     },
  898.     {
  899.         0.625, 0.83333
  900.     },
  901.     {
  902.         0.75,  0.83333
  903.     },
  904.     {
  905.         0.875, 0.83333
  906.     },
  907.     {
  908.         1.0,   0.83333
  909.     }
  910.     },
  911.     {
  912.     {
  913.         0,     1.0
  914.     },
  915.     {
  916.         0.125, 1.0
  917.     },
  918.     {
  919.         0.25,  1.0
  920.     },
  921.     {
  922.         0.375, 1.0
  923.     },
  924.     {
  925.         0.5,   1.0
  926.     },
  927.     {
  928.         0.625, 1.0
  929.     },
  930.     {
  931.         0.75,  1.0
  932.     },
  933.     {
  934.         0.875, 1.0
  935.     },
  936.     {
  937.         1.0,   1.0
  938.     }
  939.     }
  940. };
  941.  
  942.  
  943. static void SetUpAntiAliasedGrayScale(void)
  944. {
  945.     float color;
  946.     GLint i, j;
  947.  
  948.     for (i = 0; i < 16; i++) {
  949.     color = (2 * i + 1) / 32.0;
  950.     for (j = 0; j < 16; j++) {
  951.         tkSetOneColor(i*16+j, color*j/15.0, color*j/15.0, color*j/15.0);
  952.     }
  953.     }
  954. }
  955.  
  956. static void BendForward(void)
  957. {
  958.  
  959.     glTranslatef(0.0, 1.0, 0.0);
  960.     glRotatef(90.0, 1, 0, 0);
  961.     glTranslatef(0.0, -1.0, 0.0);
  962. }
  963.  
  964. static void BendLeft(void)
  965. {
  966.  
  967.     glRotatef(-90.0, 0, 0, 1);
  968.     glTranslatef(0.0, 1.0, 0.0);
  969.     glRotatef(90.0, 1, 0, 0);
  970.     glTranslatef(0.0, -1.0, 0.0);
  971. }
  972.  
  973. static void BendRight(void)
  974. {
  975.  
  976.     glRotatef(90.0, 0, 0, 1);
  977.     glTranslatef(0.0, 1.0, 0.0);
  978.     glRotatef(90.0, 1, 0, 0);
  979.     glTranslatef(0.0, -1.0, 0.0);
  980. }
  981.  
  982. static void BuildSingleCylinder(void)
  983. {
  984.  
  985.     glNewList(singleCylinder, GL_COMPILE);
  986.  
  987.     glBegin(GL_TRIANGLE_STRIP);
  988.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(scp[0]);
  989.        glNormal3fv(scp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(scp[1]);
  990.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(scp[2]);
  991.        glNormal3fv(scp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(scp[3]);
  992.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(scp[4]);
  993.        glNormal3fv(scp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(scp[5]);
  994.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(scp[6]);
  995.        glNormal3fv(scp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(scp[7]);
  996.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(scp[8]);
  997.        glNormal3fv(scp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(scp[9]);
  998.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(scp[10]);
  999.        glNormal3fv(scp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(scp[11]);
  1000.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(scp[12]);
  1001.        glNormal3fv(scp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(scp[13]);
  1002.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(scp[14]);
  1003.        glNormal3fv(scp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(scp[15]);
  1004.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(scp[16]);
  1005.        glNormal3fv(scp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(scp[17]);
  1006.     glEnd();
  1007.  
  1008.     glEndList();
  1009. }
  1010.  
  1011. static void BuildDoubleCylinder(void)
  1012. {
  1013.  
  1014.     glNewList(doubleCylinder, GL_COMPILE);
  1015.  
  1016.     glBegin(GL_TRIANGLE_STRIP);
  1017.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[0]); glVertex3fv(dcp[0]);
  1018.     glNormal3fv(dcp[0]); glTexCoord2fv(tscp[1]); glVertex3fv(dcp[1]);
  1019.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[2]); glVertex3fv(dcp[2]);
  1020.     glNormal3fv(dcp[2]); glTexCoord2fv(tscp[3]); glVertex3fv(dcp[3]);
  1021.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[4]); glVertex3fv(dcp[4]);
  1022.     glNormal3fv(dcp[4]); glTexCoord2fv(tscp[5]); glVertex3fv(dcp[5]);
  1023.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[6]); glVertex3fv(dcp[6]);
  1024.     glNormal3fv(dcp[6]); glTexCoord2fv(tscp[7]); glVertex3fv(dcp[7]);
  1025.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[8]); glVertex3fv(dcp[8]);
  1026.     glNormal3fv(dcp[8]); glTexCoord2fv(tscp[9]); glVertex3fv(dcp[9]);
  1027.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[10]); glVertex3fv(dcp[10]);
  1028.     glNormal3fv(dcp[10]); glTexCoord2fv(tscp[11]); glVertex3fv(dcp[11]);
  1029.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[12]); glVertex3fv(dcp[12]);
  1030.     glNormal3fv(dcp[12]); glTexCoord2fv(tscp[13]); glVertex3fv(dcp[13]);
  1031.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[14]); glVertex3fv(dcp[14]);
  1032.     glNormal3fv(dcp[14]); glTexCoord2fv(tscp[15]); glVertex3fv(dcp[15]);
  1033.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[16]); glVertex3fv(dcp[16]);
  1034.     glNormal3fv(dcp[16]); glTexCoord2fv(tscp[17]); glVertex3fv(dcp[17]);
  1035.     glEnd();
  1036.  
  1037.     glEndList();
  1038. }
  1039.  
  1040. static void BuildElbow(void)
  1041. {
  1042.  
  1043.     glNewList(elbow, GL_COMPILE);
  1044.  
  1045.     glBegin(GL_TRIANGLE_STRIP);
  1046.     glNormal3fv(en[0][0]); glTexCoord2fv(tep[0][0]); glVertex3fv(ep[0][0]);
  1047.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1048.     glNormal3fv(en[0][1]); glTexCoord2fv(tep[0][1]); glVertex3fv(ep[0][1]);
  1049.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1050.     glNormal3fv(en[0][2]); glTexCoord2fv(tep[0][2]); glVertex3fv(ep[0][2]);
  1051.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1052.     glNormal3fv(en[0][3]); glTexCoord2fv(tep[0][3]); glVertex3fv(ep[0][3]);
  1053.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1054.     glNormal3fv(en[0][4]); glTexCoord2fv(tep[0][4]); glVertex3fv(ep[0][4]);
  1055.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1056.     glNormal3fv(en[0][5]); glTexCoord2fv(tep[0][5]); glVertex3fv(ep[0][5]);
  1057.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1058.     glNormal3fv(en[0][6]); glTexCoord2fv(tep[0][6]); glVertex3fv(ep[0][6]);
  1059.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1060.     glNormal3fv(en[0][7]); glTexCoord2fv(tep[0][7]); glVertex3fv(ep[0][7]);
  1061.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1062.     glNormal3fv(en[0][8]); glTexCoord2fv(tep[0][8]); glVertex3fv(ep[0][8]);
  1063.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1064.     glEnd();
  1065.     glBegin(GL_TRIANGLE_STRIP);
  1066.     glNormal3fv(en[1][0]); glTexCoord2fv(tep[1][0]); glVertex3fv(ep[1][0]);
  1067.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1068.     glNormal3fv(en[1][1]); glTexCoord2fv(tep[1][1]); glVertex3fv(ep[1][1]);
  1069.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1070.     glNormal3fv(en[1][2]); glTexCoord2fv(tep[1][2]); glVertex3fv(ep[1][2]);
  1071.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1072.     glNormal3fv(en[1][3]); glTexCoord2fv(tep[1][3]); glVertex3fv(ep[1][3]);
  1073.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1074.     glNormal3fv(en[1][4]); glTexCoord2fv(tep[1][4]); glVertex3fv(ep[1][4]);
  1075.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1076.     glNormal3fv(en[1][5]); glTexCoord2fv(tep[1][5]); glVertex3fv(ep[1][5]);
  1077.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1078.     glNormal3fv(en[1][6]); glTexCoord2fv(tep[1][6]); glVertex3fv(ep[1][6]);
  1079.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1080.     glNormal3fv(en[1][7]); glTexCoord2fv(tep[1][7]); glVertex3fv(ep[1][7]);
  1081.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1082.     glNormal3fv(en[1][8]); glTexCoord2fv(tep[1][8]); glVertex3fv(ep[1][8]);
  1083.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1084.     glEnd();
  1085.     glBegin(GL_TRIANGLE_STRIP);
  1086.     glNormal3fv(en[2][0]); glTexCoord2fv(tep[2][0]); glVertex3fv(ep[2][0]);
  1087.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1088.     glNormal3fv(en[2][1]); glTexCoord2fv(tep[2][1]); glVertex3fv(ep[2][1]);
  1089.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1090.     glNormal3fv(en[2][2]); glTexCoord2fv(tep[2][2]); glVertex3fv(ep[2][2]);
  1091.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1092.     glNormal3fv(en[2][3]); glTexCoord2fv(tep[2][3]); glVertex3fv(ep[2][3]);
  1093.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1094.     glNormal3fv(en[2][4]); glTexCoord2fv(tep[2][4]); glVertex3fv(ep[2][4]);
  1095.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1096.     glNormal3fv(en[2][5]); glTexCoord2fv(tep[2][5]); glVertex3fv(ep[2][5]);
  1097.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1098.     glNormal3fv(en[2][6]); glTexCoord2fv(tep[2][6]); glVertex3fv(ep[2][6]);
  1099.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1100.     glNormal3fv(en[2][7]); glTexCoord2fv(tep[2][7]); glVertex3fv(ep[2][7]);
  1101.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1102.     glNormal3fv(en[2][8]); glTexCoord2fv(tep[2][8]); glVertex3fv(ep[2][8]);
  1103.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1104.     glEnd();
  1105.     glBegin(GL_TRIANGLE_STRIP);
  1106.     glNormal3fv(en[3][0]); glTexCoord2fv(tep[3][0]); glVertex3fv(ep[3][0]);
  1107.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1108.     glNormal3fv(en[3][1]); glTexCoord2fv(tep[3][1]); glVertex3fv(ep[3][1]);
  1109.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1110.     glNormal3fv(en[3][2]); glTexCoord2fv(tep[3][2]); glVertex3fv(ep[3][2]);
  1111.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1112.     glNormal3fv(en[3][3]); glTexCoord2fv(tep[3][3]); glVertex3fv(ep[3][3]);
  1113.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1114.     glNormal3fv(en[3][4]); glTexCoord2fv(tep[3][4]); glVertex3fv(ep[3][4]);
  1115.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1116.     glNormal3fv(en[3][5]); glTexCoord2fv(tep[3][5]); glVertex3fv(ep[3][5]);
  1117.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1118.     glNormal3fv(en[3][6]); glTexCoord2fv(tep[3][6]); glVertex3fv(ep[3][6]);
  1119.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1120.     glNormal3fv(en[3][7]); glTexCoord2fv(tep[3][7]); glVertex3fv(ep[3][7]);
  1121.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1122.     glNormal3fv(en[3][8]); glTexCoord2fv(tep[3][8]); glVertex3fv(ep[3][8]);
  1123.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1124.     glEnd();
  1125.     glBegin(GL_TRIANGLE_STRIP);
  1126.     glNormal3fv(en[4][0]); glTexCoord2fv(tep[4][0]); glVertex3fv(ep[4][0]);
  1127.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1128.     glNormal3fv(en[4][1]); glTexCoord2fv(tep[4][1]); glVertex3fv(ep[4][1]);
  1129.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1130.     glNormal3fv(en[4][2]); glTexCoord2fv(tep[4][2]); glVertex3fv(ep[4][2]);
  1131.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1132.     glNormal3fv(en[4][3]); glTexCoord2fv(tep[4][3]); glVertex3fv(ep[4][3]);
  1133.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1134.     glNormal3fv(en[4][4]); glTexCoord2fv(tep[4][4]); glVertex3fv(ep[4][4]);
  1135.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1136.     glNormal3fv(en[4][5]); glTexCoord2fv(tep[4][5]); glVertex3fv(ep[4][5]);
  1137.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1138.     glNormal3fv(en[4][6]); glTexCoord2fv(tep[4][6]); glVertex3fv(ep[4][6]);
  1139.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1140.     glNormal3fv(en[4][7]); glTexCoord2fv(tep[4][7]); glVertex3fv(ep[4][7]);
  1141.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1142.     glNormal3fv(en[4][8]); glTexCoord2fv(tep[4][8]); glVertex3fv(ep[4][8]);
  1143.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1144.     glEnd();
  1145.     glBegin(GL_TRIANGLE_STRIP);
  1146.     glNormal3fv(en[5][0]); glTexCoord2fv(tep[5][0]); glVertex3fv(ep[5][0]);
  1147.     glNormal3fv(en[6][0]); glTexCoord2fv(tep[6][0]); glVertex3fv(ep[6][0]);
  1148.     glNormal3fv(en[5][1]); glTexCoord2fv(tep[5][1]); glVertex3fv(ep[5][1]);
  1149.     glNormal3fv(en[6][1]); glTexCoord2fv(tep[6][1]); glVertex3fv(ep[6][1]);
  1150.     glNormal3fv(en[5][2]); glTexCoord2fv(tep[5][2]); glVertex3fv(ep[5][2]);
  1151.     glNormal3fv(en[6][2]); glTexCoord2fv(tep[6][2]); glVertex3fv(ep[6][2]);
  1152.     glNormal3fv(en[5][3]); glTexCoord2fv(tep[5][3]); glVertex3fv(ep[5][3]);
  1153.     glNormal3fv(en[6][3]); glTexCoord2fv(tep[6][3]); glVertex3fv(ep[6][3]);
  1154.     glNormal3fv(en[5][4]); glTexCoord2fv(tep[5][4]); glVertex3fv(ep[5][4]);
  1155.     glNormal3fv(en[6][4]); glTexCoord2fv(tep[6][4]); glVertex3fv(ep[6][4]);
  1156.     glNormal3fv(en[5][5]); glTexCoord2fv(tep[5][5]); glVertex3fv(ep[5][5]);
  1157.     glNormal3fv(en[6][5]); glTexCoord2fv(tep[6][5]); glVertex3fv(ep[6][5]);
  1158.     glNormal3fv(en[5][6]); glTexCoord2fv(tep[5][6]); glVertex3fv(ep[5][6]);
  1159.     glNormal3fv(en[6][6]); glTexCoord2fv(tep[6][6]); glVertex3fv(ep[6][6]);
  1160.     glNormal3fv(en[5][7]); glTexCoord2fv(tep[5][7]); glVertex3fv(ep[5][7]);
  1161.     glNormal3fv(en[6][7]); glTexCoord2fv(tep[6][7]); glVertex3fv(ep[6][7]);
  1162.     glNormal3fv(en[5][8]); glTexCoord2fv(tep[5][8]); glVertex3fv(ep[5][8]);
  1163.     glNormal3fv(en[6][8]); glTexCoord2fv(tep[6][8]); glVertex3fv(ep[6][8]);
  1164.     glEnd();
  1165.  
  1166.     glEndList();
  1167. }
  1168.  
  1169. static void BuildLogo(void)
  1170. {
  1171.  
  1172.     glNewList(logo, GL_COMPILE);
  1173.  
  1174.     glTranslatef(5.5, -3.5, 4.5);
  1175.     glTranslatef(0.0, 0.0, -7.0);
  1176.     glCallList(doubleCylinder);
  1177.     BendForward();
  1178.     glCallList(elbow);
  1179.     glTranslatef(0.0, 0.0, -7.0);
  1180.     glCallList(doubleCylinder);
  1181.     BendForward();
  1182.     glCallList(elbow);
  1183.     glTranslatef(0.0, 0.0, -5.0);
  1184.     glCallList(singleCylinder);
  1185.     BendRight();
  1186.     glCallList(elbow);
  1187.     glTranslatef(0.0, 0.0, -7.0);
  1188.     glCallList(doubleCylinder);
  1189.     BendForward();
  1190.     glCallList(elbow);
  1191.     glTranslatef(0.0, 0.0, -7.0);
  1192.     glCallList(doubleCylinder);
  1193.     BendForward();
  1194.     glCallList(elbow);
  1195.     glTranslatef(0.0, 0.0, -5.0);
  1196.     glCallList(singleCylinder);
  1197.     BendLeft();
  1198.     glCallList(elbow);
  1199.     glTranslatef(0.0, 0.0, -7.0);
  1200.     glCallList(doubleCylinder);
  1201.     BendForward();
  1202.     glCallList(elbow);
  1203.     glTranslatef(0.0, 0.0, -7.0);
  1204.     glCallList(doubleCylinder);
  1205.     BendForward();
  1206.     glCallList(elbow);
  1207.     glTranslatef(0.0, 0.0, -5.0);
  1208.     glCallList(singleCylinder);
  1209.     BendRight();
  1210.     glCallList(elbow);
  1211.     glTranslatef(0.0, 0.0, -7.0);
  1212.     glCallList(doubleCylinder);
  1213.     BendForward();
  1214.     glCallList(elbow);
  1215.     glTranslatef(0.0, 0.0, -7.0);
  1216.     glCallList(doubleCylinder);
  1217.     BendForward();
  1218.     glCallList(elbow);
  1219.     glTranslatef(0.0, 0.0, -5.0);
  1220.     glCallList(singleCylinder);
  1221.     BendLeft();
  1222.     glCallList(elbow);
  1223.     glTranslatef(0.0, 0.0, -7.0);
  1224.     glCallList(doubleCylinder);
  1225.     BendForward();
  1226.     glCallList(elbow);
  1227.     glTranslatef(0.0, 0.0, -7.0);
  1228.     glCallList(doubleCylinder);
  1229.     BendForward();
  1230.     glCallList(elbow);
  1231.     glTranslatef(0.0, 0.0, -5.0);
  1232.     glCallList(singleCylinder);
  1233.     BendRight();
  1234.     glCallList(elbow);
  1235.     glTranslatef(0.0, 0.0, -7.0);
  1236.     glCallList(doubleCylinder);
  1237.     BendForward();
  1238.     glCallList(elbow);
  1239.     glTranslatef(0.0, 0.0, -7.0);
  1240.     glCallList(doubleCylinder);
  1241.     BendForward();
  1242.     glCallList(elbow);
  1243.     glTranslatef(0.0, 0.0, -5.0);
  1244.     glCallList(singleCylinder);
  1245.     BendLeft();
  1246.     glCallList(elbow);
  1247.  
  1248.     glEndList();
  1249. }
  1250.  
  1251. static void BuildLists(void)
  1252. {
  1253.  
  1254.     singleCylinder = glGenLists(1);
  1255.     doubleCylinder = glGenLists(1);
  1256.     elbow = glGenLists(1);
  1257.     logo = glGenLists(1);
  1258.  
  1259.     BuildSingleCylinder();
  1260.     BuildDoubleCylinder();
  1261.     BuildElbow();
  1262.     BuildLogo();
  1263. }
  1264.  
  1265. static void Init(void)
  1266. {
  1267.     static float ambient[] = {0.1, 0.1, 0.1, 1.0};
  1268.     static float diffuse[] = {0.5, 1.0, 1.0, 1.0};
  1269.     static float position[] = {90.0, 90.0, 150.0, 0.0};
  1270.     static float front_mat_shininess[] = {30.0};
  1271.     static float front_mat_specular[] = {0.2, 0.2, 0.2, 1.0};
  1272.     static float front_mat_diffuse[] = {0.5, 0.28, 0.38, 1.0};
  1273.     static float back_mat_shininess[] = {50.0};
  1274.     static float back_mat_specular[] = {0.5, 0.5, 0.2, 1.0};
  1275.     static float back_mat_diffuse[] = {1.0, 1.0, 0.2, 1.0};
  1276.     static float lmodel_ambient[] = {1.0, 1.0, 1.0, 1.0};
  1277.     static float lmodel_twoside[] = {GL_TRUE};
  1278.  
  1279.     glClearColor(0.0, 0.0, 0.0, 0.0);
  1280.  
  1281.     glFrontFace(GL_CW);
  1282.  
  1283.     glEnable(GL_DEPTH_TEST);
  1284.  
  1285.     glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
  1286.     glLightModelfv(GL_LIGHT_MODEL_TWO_SIDE, lmodel_twoside);
  1287.     glLightfv(GL_LIGHT0, GL_AMBIENT, ambient);
  1288.     glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuse);
  1289.     glLightfv(GL_LIGHT0, GL_POSITION, position);
  1290.     glEnable(GL_LIGHTING);
  1291.     glEnable(GL_LIGHT0);
  1292.     
  1293.     glMaterialfv(GL_FRONT, GL_SHININESS, front_mat_shininess);
  1294.     glMaterialfv(GL_FRONT, GL_SPECULAR, front_mat_specular);
  1295.     glMaterialfv(GL_FRONT, GL_DIFFUSE, front_mat_diffuse);
  1296.     glMaterialfv(GL_BACK, GL_SHININESS, back_mat_shininess);
  1297.     glMaterialfv(GL_BACK, GL_SPECULAR, back_mat_specular);
  1298.     glMaterialfv(GL_BACK, GL_DIFFUSE, back_mat_diffuse);
  1299.  
  1300.     glEnable(GL_CLIP_PLANE0);
  1301.  
  1302.     if (rgb) {
  1303.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1304.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1305.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1306.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1307.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1308.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH, CHECKIMAGEHEIGHT, 0,
  1309.              GL_RGB, GL_UNSIGNED_BYTE, (GLvoid *)checkImage);
  1310.     glEnable(GL_TEXTURE_2D);
  1311.  
  1312.     glCullFace(GL_BACK);
  1313.     glEnable(GL_CULL_FACE);
  1314.     } else {
  1315.     tkSetGreyRamp();
  1316.         /* commented out by BrianP because it's the wrong way to handle a 4-bit visual!
  1317.     if (doubleBuffer) {
  1318.         colorIndexes[1] = 10;
  1319.         colorIndexes[2] = 15;
  1320.     }
  1321.         */
  1322.     glMaterialiv(GL_FRONT_AND_BACK, GL_COLOR_INDEXES, colorIndexes);
  1323.     }
  1324.  
  1325.     BuildLists();
  1326.  
  1327.     dithering = GL_TRUE;
  1328.     shade = GL_TRUE;
  1329.     doStipple = GL_FALSE;
  1330.     polyMode = GL_BACK;
  1331. }
  1332.  
  1333. static void Reshape(int width, int height)
  1334. {
  1335.     glViewport(0, 0, (GLint)width, (GLint)height);
  1336.  
  1337.     glMatrixMode(GL_PROJECTION);
  1338.     glLoadIdentity();
  1339.     gluPerspective(90, 1.0, 1.0, 200.0);
  1340.     glMatrixMode(GL_MODELVIEW);
  1341. }
  1342.  
  1343. static GLenum Key(int key, GLenum mask)
  1344. {
  1345.  
  1346.     switch (key) {
  1347.       case TK_ESCAPE:
  1348.     tkQuit();
  1349.  
  1350.       case TK_LEFT:
  1351.     yRotation += 0.5;
  1352.     break;
  1353.       case TK_RIGHT:
  1354.     yRotation -= 0.5;
  1355.     break;
  1356.       case TK_UP:
  1357.     plane[3] += 2.0;
  1358.     break;
  1359.       case TK_DOWN:
  1360.     plane[3] -= 2.0;
  1361.     break;
  1362.       case TK_Z:
  1363.     zTranslation -= 1.0;
  1364.     break;
  1365.       case TK_z:
  1366.     zTranslation += 1.0;
  1367.     break;
  1368.  
  1369.       case TK_1:
  1370.     glPolygonMode(polyMode, GL_POINT);
  1371.     break;
  1372.       case TK_2:
  1373.     glPolygonMode(polyMode, GL_LINE);
  1374.     break;
  1375.       case TK_3:
  1376.     glPolygonMode(polyMode, GL_FILL);
  1377.     break;
  1378.       case TK_p:
  1379.     switch (polyMode) {
  1380.       case GL_BACK:
  1381.         polyMode = GL_FRONT;
  1382.         break;
  1383.       case GL_FRONT:
  1384.         polyMode = GL_FRONT_AND_BACK;
  1385.         break;
  1386.       case GL_FRONT_AND_BACK:
  1387.         polyMode = GL_BACK;
  1388.         break;
  1389.           default:
  1390.             break;
  1391.     }
  1392.     break;
  1393.  
  1394.       case TK_4:
  1395.     glHint(GL_POLYGON_SMOOTH_HINT, GL_NICEST);
  1396.     break;
  1397.       case TK_5:
  1398.     glEnable(GL_POLYGON_SMOOTH);
  1399.     if (rgb) {
  1400.         glBlendFunc(GL_SRC_ALPHA, GL_ONE);
  1401.         glEnable(GL_BLEND);
  1402.         glDisable(GL_DEPTH_TEST);
  1403.     } else {
  1404.         SetUpAntiAliasedGrayScale();
  1405.     }
  1406.     break;
  1407.       case TK_6:
  1408.     glDisable(GL_POLYGON_SMOOTH);
  1409.     if (rgb) {
  1410.         glBlendFunc(GL_ONE, GL_ZERO);
  1411.         glDisable(GL_BLEND);
  1412.         glEnable(GL_DEPTH_TEST);
  1413.     } else {
  1414.         tkSetGreyRamp();
  1415.     }
  1416.     break;
  1417.  
  1418.       case TK_8:
  1419.     dithering = !dithering;
  1420.     (dithering) ? glEnable(GL_DITHER) : glDisable(GL_DITHER);
  1421.     break;
  1422.  
  1423.       case TK_9:
  1424.     doStipple = !doStipple;
  1425.     if (doStipple) {
  1426.         glPolygonStipple(stipple);
  1427.         glEnable(GL_POLYGON_STIPPLE);
  1428.     } else {
  1429.         glDisable(GL_POLYGON_STIPPLE);
  1430.     }
  1431.     break;
  1432.  
  1433.       case TK_0:
  1434.     shade = !shade;
  1435.     (shade) ? glShadeModel(GL_SMOOTH) : glShadeModel(GL_FLAT);
  1436.     break;
  1437.  
  1438.       case TK_q:
  1439.     glDisable(GL_CULL_FACE);
  1440.     break;
  1441.       case TK_w:
  1442.     glEnable(GL_CULL_FACE);
  1443.     glCullFace(GL_FRONT);
  1444.     break;
  1445.       case TK_e:
  1446.     glEnable(GL_CULL_FACE);
  1447.     glCullFace(GL_BACK);
  1448.     break;
  1449.  
  1450.       case TK_r:
  1451.     glFrontFace(GL_CW);
  1452.     break;
  1453.       case TK_t: 
  1454.     glFrontFace(GL_CCW);
  1455.     break;
  1456.       case TK_y:
  1457.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1458.     glPixelStorei(GL_UNPACK_LSB_FIRST, 0);
  1459.     glPolygonStipple(stipple);
  1460.     break;
  1461.       case TK_u:
  1462.     glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1463.     glPixelStorei(GL_UNPACK_LSB_FIRST, 1);
  1464.     glPolygonStipple(stipple);
  1465.     break;
  1466.  
  1467.       case TK_a:
  1468.     glEnable(GL_TEXTURE_2D);
  1469.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1470.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1471.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1472.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1473.     glTexImage2D(GL_TEXTURE_2D, 0, 4, BRICKIMAGEWIDTH,
  1474.              BRICKIMAGEHEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE,
  1475.              (GLvoid *)brickImage);
  1476.     break;
  1477.       case TK_s:
  1478.     glEnable(GL_TEXTURE_2D);
  1479.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, repeat);
  1480.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, repeat);
  1481.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, nearest);
  1482.     glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, nearest);
  1483.     glTexImage2D(GL_TEXTURE_2D, 0, 3, CHECKIMAGEWIDTH,
  1484.              CHECKIMAGEHEIGHT, 0, GL_RGB, GL_UNSIGNED_BYTE,
  1485.              (GLvoid *)checkImage);
  1486.     break;
  1487.       case TK_d:
  1488.     glDisable(GL_TEXTURE_2D);
  1489.     break;
  1490.  
  1491.       case TK_f:
  1492.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, decal);
  1493.     break;
  1494.       case TK_g:
  1495.     glTexEnvfv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, modulate);
  1496.     break;
  1497.  
  1498.       case TK_n:
  1499.         /* added by BrianP */
  1500.         noDraw = !noDraw;
  1501.         if (noDraw) {
  1502.            glDrawBuffer( GL_NONE );
  1503.         }
  1504.         else {
  1505.            if (doubleBuffer) {
  1506.               glDrawBuffer( GL_BACK );
  1507.            }
  1508.            else {
  1509.               glDrawBuffer( GL_FRONT );
  1510.            }
  1511.         }
  1512.         break;
  1513.  
  1514.       default:
  1515.     return GL_FALSE;
  1516.     }
  1517.  
  1518.     return GL_TRUE;
  1519. }
  1520.  
  1521. static void Draw(void)
  1522. {
  1523.  
  1524.     glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
  1525.  
  1526.     glPushMatrix();
  1527.  
  1528.     glTranslatef(0, 0, zTranslation);
  1529.     glRotatef(30.0, 1, 0, 0);
  1530.     glRotatef(yRotation, 0, 1, 0);
  1531.     glClipPlane(GL_CLIP_PLANE0, plane);
  1532.     glCallList(logo);
  1533.  
  1534.     glPopMatrix();
  1535.  
  1536.     glFlush();
  1537.  
  1538.     if (doubleBuffer) {
  1539.     tkSwapBuffers();
  1540.     }
  1541. }
  1542.  
  1543. static GLenum Args(int argc, char **argv)
  1544. {
  1545.     GLint i;
  1546.  
  1547.     rgb = GL_TRUE;
  1548.     doubleBuffer = GL_FALSE;
  1549.     directRender = GL_TRUE;
  1550.  
  1551.     for (i = 1; i < argc; i++) {
  1552.     if (strcmp(argv[i], "-ci") == 0) {
  1553.         rgb = GL_FALSE;
  1554.     } else if (strcmp(argv[i], "-rgb") == 0) {
  1555.         rgb = GL_TRUE;
  1556.     } else if (strcmp(argv[i], "-sb") == 0) {
  1557.         doubleBuffer = GL_FALSE;
  1558.     } else if (strcmp(argv[i], "-db") == 0) {
  1559.         doubleBuffer = GL_TRUE;
  1560.     } else if (strcmp(argv[i], "-dr") == 0) {
  1561.         directRender = GL_TRUE;
  1562.     } else if (strcmp(argv[i], "-ir") == 0) {
  1563.         directRender = GL_FALSE;
  1564.     } else {
  1565.         printf("%s (Bad option).\n", argv[i]);
  1566.         return GL_FALSE;
  1567.     }
  1568.     }
  1569.     return GL_TRUE;
  1570. }
  1571.  
  1572. void main(int argc, char **argv)
  1573. {
  1574.     GLenum type;
  1575.  
  1576.     if (Args(argc, argv) == GL_FALSE) {
  1577.     tkQuit();
  1578.     }
  1579.  
  1580.     tkInitPosition(0, 0, 300, 300);
  1581.  
  1582.     type = TK_DEPTH;
  1583.     type |= (rgb) ? TK_RGB : TK_INDEX;
  1584.     type |= (doubleBuffer) ? TK_DOUBLE : TK_SINGLE;
  1585.     type |= (directRender) ? TK_DIRECT : TK_INDIRECT;
  1586.     tkInitDisplayMode(type);
  1587.  
  1588.     if (tkInitWindow("Logo Test") == GL_FALSE) {
  1589.     tkQuit();
  1590.     }
  1591.  
  1592.     Init();
  1593.  
  1594.     tkExposeFunc(Reshape);
  1595.     tkReshapeFunc(Reshape);
  1596.     tkKeyDownFunc(Key);
  1597.     tkDisplayFunc(Draw);
  1598.     tkExec();
  1599. }
  1600.